package com.nageoffer.shortlink.project.config;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 初始化限流配置
 */
@Component
//实现InitializingBean接口，重写afterPropertiesSet方法，在Bean初始化完成后执行初始化逻辑
public class SentinelRuleConfig implements InitializingBean {    // 实现InitializingBean接口的方法，在Bean属性初始化完成后调用


    @Override
    public void afterPropertiesSet() throws Exception {
        // 创建一个FlowRule（流控规则）列表，用于存储所有限流规则
        List<FlowRule> rules = new ArrayList<>();
        // 创建一个具体的流控规则对象，用于配置某一资源的限流策略
        FlowRule createOrderRule = new FlowRule();
        // 设置需要限流的资源名称，需与@SentinelResource注解的value属性一致
        // 这里表示对"create_short-link"这个资源进行限流
        createOrderRule.setResource("create_short-link");
        // 设置限流阈值类型：RuleConstant.FLOW_GRADE_QPS表示按QPS（每秒查询数）限流
        // 可选值还有FLOW_GRADE_THREAD（按线程数限流）
        createOrderRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置限流阈值：当QPS达到1时触发限流
        createOrderRule.setCount(1);
        // 将定义好的流控规则添加到规则列表中
        rules.add(createOrderRule);
        // 将规则列表加载到Sentinel的FlowRuleManager中，使规则生效
        FlowRuleManager.loadRules(rules);
    }
}